2023/12/232122字符

变量声明

JavaScript 官网

var 存在的问题

  1. 变量可被重新赋值;
  2. 变量提升;
  3. 作用域:for 循环输出 i = i + 1, 需通过闭包解决;
  4. 挂载到 window 上,污染全局变量。
if (Math.random() > .5) {
    var a = 111;
}
console.log(a);  // 进入判断:111,否则:undefined

function test () {
    var arr = [];
    for (var i = 0; i < 10; i ++) {
        arr[i] = () => console.log(i);
    }
    return arr;
}
var myArr = test();
for(var j = 0; j < 10; j ++){
    myArr[j]();  //--> 10 * 10  函数执行
}

let

块级作用域 {} 加强

if (true) {
    let num = 123;
}
console.log(num);  //--> 报错 无法访问到 num

let 没有预解析,不存在变量提升,必须先定义,再使用

let num = 234;
function fn () {
    console.log(num2);  // TDZ 暂时性死区
    let num = 345;
}
fn();  //--> num is not defined

不可重复定义变量

let num3 = 123;
let num3 = 234;  //--> 'num3' has already been declared

块级作用域影响

for(let i = 0; i < 3; i ++){
    console.log(i);  //--> 0 1 2
}
console.log(i);  //--> 'i' has already been declared 
let arr = [];
for(let i = 0; i < 10; i ++){
    arr[i] = function(){
        console.log(i);
    }
}
arr[2]();  //--> 2

const

常量不得随意更改

const num;
num = 234;  //--> 报错

const arr = [1, 2, 3, 4, 5];
arr = [];  //--> 报错  对象或数组数不能进行直接更改
const arr1 = ['apple', 'banana'];
arr1.push('orange');
console.log(arr1);  //--> ["apple", "banana", "orange"]  对象本身是可以修改的

const arr2 = Object.freeze(['apple', 'banana']);  // 冻结对象
arr2.push('orange');
console.log(arr2);  //--> object is not extensible

// 特殊的常量量命名方式:全部大写 const PI = 3.1415926;

for (const prop in arr1) {
    console.log(prop)
}